package cn.edu.scau.nursingcenter.util;

import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;

import cn.edu.scau.nursingcenter.config.Audience;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

/**
 * JWT工具类:生成token 验证token 
 * @author feng
 *
 */
public abstract class JWTTokenUtil {
	public static final String AUTH_HEAD_KEY="Authorization";
	
	public static String createJWT(String userid,String username, Audience audience) {
		//使用HAS256加密算法
		SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
		//获取当前时间
		long begin_milis = System.currentTimeMillis();
		//实例化java.util.Date 对象
		Date begin_date = new Date(begin_milis);
		//生成签名密钥
		byte[] api = DatatypeConverter.parseBase64Binary(audience.getBase64Secret());
		Key key = new SecretKeySpec(api, signatureAlgorithm.getJcaName());
		//设置JWT的header（头信息）
		Map<String , Object> header = new HashMap<String, Object>();
		header.put("alg",SignatureAlgorithm.HS256.getValue());
		header.put("typ", "JWT");
	    //设置JWT 的 payload(有效载荷)
		JwtBuilder builder = Jwts.builder().setHeader(header)//设置头信息
				.claim("userid", userid)//将特定的用户信息存储在claim中，敏感数据需要加密
				.setSubject(username)//设置JWT主体body
				.setIssuer(audience.getClientid())//设置签发主体
				.setIssuedAt(new Date())//设置签发时间
				.setAudience(audience.getName())//设置接收者
				.signWith(signatureAlgorithm, key);//设置签名
		//添加过期时间
		int time = audience.getExpiresSecond();
		if(time > 0) {
			long exp = begin_milis + time*1000;
			Date exp_date = new Date(exp);
			builder.setExpiration(exp_date)//是一个时间戳，exp_date代表过期时间
				.setNotBefore(begin_date);//是一个时间戳， begin_date代表开始生效时间，在此之前验证都是失败
		}
		//简单说就是生成token
		return builder.compact();//生成序列化安全url字符串
		
	}
	/**
	  * 解析JWT
	 * @param token
	 * @param base64Security
	 * @return
	 */
	public static Claims parseJWT(String token,String base64Security) {
		Claims claims = Jwts.parser()
				.setSigningKey(DatatypeConverter.parseBase64Binary(base64Security))
				.parseClaimsJws(token)
				.getBody();
		return claims;
	}
	/**
	  * 从token中获取username
	 * @param token
	 * @param base64Security
	 * @return
	 */
	public static String  getUserName(String token,String base64Security) {
		//对应生成jwt时的选项
		return  parseJWT(token, base64Security).getSubject();
	}
	/**
	  * 从token中获取userid
	 * @param token
	 * @param base64Security
	 * @return
	 */
	public static String  getUserId(String token,String base64Security) {
		//对应生成jwt时的选项
		return  parseJWT(token, base64Security).get("userid", String.class);
	}
	/**
	  * 判断客户端的jwt是否过期
	 * @param token
	 * @param base64Security
	 * @return
	 */
	
	public static boolean isExpiration(String token,String base64Security) {
		//过期时间与当前时间 进行比较
		Claims claims = parseJWT(token, base64Security);
		System.out.println("expirations:"+ claims.getExpiration().toLocaleString());
		//return parseJWT(token, base64Security).getExpiration().before(new Date());
		return claims.getExpiration().before(new Date());
	}

}
